package com.locust.base.common.base.dao.support;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import tk.mybatis.mapper.common.ConditionMapper;
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

import com.github.pagehelper.Page;
import com.locust.base.common.utils.Paginator;

public interface BaseMapper<T, PK> extends Mapper<T>, MySqlMapper<T>, ConditionMapper<T>, IdsMapper<T> {

	/**
	 * 删除（根据ID 批量删除），<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param idList 主键ID列表
	 * @return
	 */
	int deleteBatchIds(List<PK> idList);
	
	/**
	 * 根据 whereEntity 条件更新记录，<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param entity 实体对象
	 * @param whereEntity 实体查询条件（可以为 null）
	 * @return
	 */
	int update(@Param("entity") T entity, @Param("entityWhere") T whereEntity);
	
	/**
	 * 根据 whereEntity 条件选择更新记录，<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param entity 实体对象
	 * @param whereEntity whereEntity（可以为 null） 实体查询条件
	 * @return
	 */
	int updateSelective(@Param("entity") T entity, @Param("entityWhere") T whereEntity);
	
	/**
	 * 根据ID 批量更新，<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param entityList 实体对象列表
	 * @return
	 */
	int updateBatchById(List<T> entityList);
	
	/**
	 * 查询（根据ID 批量查询），<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param idList 主键ID列表
	 * @return
	 */
	List<T> selectBatchIds(List<PK> idList);
	
	/**
	 * 查询列表，<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param entity 实体对象
	 * @param orderBy 排序字段
	 * @return
	 */
	List<T> selectList(@Param("entity") T entity, @Param("orderBy") String orderBy);
	
	/**
	 * 翻页查询，<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param paginator 对象封装了分页信息和排序条件
	 * @param entity 筛选条件
	 * @return
	 */
	Page<T> selectPage(@Param("paginator") Paginator paginator, @Param("entity") T entity);
	
	/**
	 * 翻页查询，<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param paginator 对象封装了分页信息和排序条件
	 * @return
	 */
	Page<T> selectPage(@Param("paginator") Paginator paginator);
	
	/**
	 * 翻页查询，<b style="color:red">需要自己定义相应的Mapper标签</b>
	 * @param params Map集合对象（检索条件）
	 * @return
	 */
	Page<T> selectPageByMap(@Param("params") Map<String, Object> params);
	
	/**
	 * 检查字段的值是否存在
	 * @param field 表字段
	 * @param value 值
	 * @return
	 */
	T checkValue(@Param("field") String field, @Param("value") Object value) ;
	
}
